<?php
namespace app\api\job;
use think\Controller;
use think\Db;
use think\facade\Hook;
use think\queue\Job;
use think\Exception;
use think\Queue;
/**
 * 文件路径： \application\index\job\Hello.php
 * 这是一个消费者类，用于处理 helloJobQueue 队列中的任务
 * php think queue:work --daemon
 */
class Kou extends Base {
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job, $data) {
        // 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.
        $isJobStillNeedToBeDone = $this->checkKou($data);
        if (!$isJobStillNeedToBeDone) {
            print("队列不在执行删除".PHP_EOL);
            $job->delete();
            return ;
        }
        $this->doKou($data);
		$job->delete();
    }


    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果 false 不需要以下执行了 true需要执行
     */
    private function checkKou($data) {
        $payment = $data['payment']; //通道
        $mission = $data['mission']; //任务
		//判断任务是否存在
        $retInfo = Db::name('mission')->where('mission_id', $mission['mission_id'])->find();
        if (!$retInfo) {
            //$this->queueLog($payment['payment_controller'], $mission['mission_id'], 'mission_id不存在');
            return false;
        }
        $jieGuo = false;
        //申请状态 0 申请中 1复核成功 2复核审核失败 3提交上游等待处理 4 上游处理失败 5 上游处理成功
        //只有等于1的成功
        switch ($retInfo['mission_queues']) {
            case '0':
                $jieGuo = false;
                $jieTxt = 'MQ未加入列队|状态为:' . $retInfo['mission_queues'];
            break;
            case '1':
                $jieGuo = true;
                $jieTxt = 'MQ列队成功|状态为:' . $retInfo['mission_queues'];
            break;
            case '2':
                $jieGuo = false;
                $jieTxt = 'MQ提交列队失败|状态为:' . $retInfo['mission_queues'];
            break;
            case '3':
                $jieGuo = false;
                $jieTxt = 'MQ列队处理成功|状态为:' . $retInfo['mission_queues'];
            break;
            case '4':
                $jieGuo = false;
                $jieTxt = 'MQ列队处理失败|状态为:' . $retInfo['mission_queues'];
            break;
            default:
                $jieGuo = false;
                $jieTxt = 'MQ异常订单订单状态为:' . $retInfo['mission_queues'];
        }
        return $jieGuo;
    }
    /**
     * 根据消息中的数据进行实际的业务处理
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function doKou($data) {
        //调用通道
		print("队列开始执行：".$data['payment']['payment_controller']."----".$data['logid'].PHP_EOL);
        $retData = controller("pay/".$data["payment"]["payment_controller"])->pay($data['mission']);
		print("队列执行完毕，返回信息：".json_encode($retData).PHP_EOL);
		//$this->queueLog($data['payment']['payment_controller'], $data['logid'], "队列执行完毕，返回信息".json_encode($retData)."；之后删除队列");
    }
}
